#ifndef _JUDGESYS21_H_
#define _JUDGESYS21_H_

#include "device.h"
#include "string.h"
/***
 * 裁判系统学生串口协议附录
 * 2020.2.25	V1.0 首次发布
 * 2020.5		V1.1
1. 增加飞镖机器人客户端指令数据
2. 交互数据 ID 说明中增加缺少的雷达站 ID
**/



#define R_RobotId_Hero              	((uint16_t)(1))
#define R_RobotId_Engineer          	((uint16_t)(2))
#define R_RobotId_Infantry1         	((uint16_t)(3))
#define R_RobotId_Infantry2         	((uint16_t)(4))
#define R_RobotId_Infantry3         	((uint16_t)(5))
#define R_RobotId_Aerial            	((uint16_t)(6))
#define R_RobotId_Sentry            	((uint16_t)(7))
#define R_RobotId_Dart             		((uint16_t)(8))
#define R_RobotId_Radar             	((uint16_t)(9))

#define B_RobotId_Hero              	((uint16_t)(101))
#define B_RobotId_Engineer          	((uint16_t)(102))
#define B_RobotId_Infantry1         	((uint16_t)(103))
#define B_RobotId_Infantry2         	((uint16_t)(104))
#define B_RobotId_Infantry3         	((uint16_t)(105))
#define B_RobotId_Aerial            	((uint16_t)(106))
#define B_RobotId_Sentry            	((uint16_t)(107))
#define B_RobotId_Dart              	((uint16_t)(108))
#define B_RobotId_Radar             	((uint16_t)(109))

#define R_ClientId_Hero              	(0x0101)
#define R_ClientId_Engineer          	(0x0102)
#define R_ClientId_Infantry1         	(0x0103)
#define R_ClientId_Infantry2         	(0x0104)
#define R_ClientId_Infantry3         	(0x0105)
#define R_ClientId_Aerial            	(0x0106)

#define B_ClientId_Hero              	(0x0165)
#define B_ClientId_Engineer          	(0x0166)
#define B_ClientId_Infantry1         	(0x0167)
#define B_ClientId_Infantry2         	(0x0168)
#define B_ClientId_Infantry3         	(0x0169)
#define B_ClientId_Aerial            	(0x016A)

/****************************************
* 此处定义当前队伍颜色
 * *************************************/
#define Team_Red						0
#define	Team_Blue						1

/****************************************
* 此处定义当前机器人类型，不区分颜色
 * *************************************/
#define Robot_Dart						8


/****************************************
 * 此处定义当前机器人ID和对应客户端ID
 * *************************************/
#define CURRENT_RobotId             	B_RobotId_Infantry3
#define CURRENT_ClientId            	B_ClientId_Infantry3
/***************************************/
/* 机器人交互数据的内容ID */
#define CLIENT_DATA_CMD_ID          	(0x0180)
#define INTERNATION_CMD_ID				    (0x0301)//交互数据 机器人间通信
#define ROBOT_DATA_CMD_ID_MIN       	(0x0200)
#define ROBOT_DATA_CMD_ID_MAX       	(0x02FF)
#define GRAPHIC_SINGLE_DATA_CMD_ID      (0x0101)	//绘制一个图形的命令 
#define GRAPHIC_DOUBLE_DATA_CMD_ID      (0x0102)	//绘制二个图形的命令 
#define DLETE_GRAPHIC_DATA_CMD_ID		(0X0100)	//删除图层
#define CHAR_GRAPHIC_DATA_CMD_ID		(0X0110)	//发送字符
/* 裁判系统数据包长度 */
#define JUDGE_RX_DATA_MAX_SIZE      	(128)
#define INTERACTIVE_DATA_MAX_SIZE   	(113)     //128-9-6
#define JUDGE_PACKE_MESG_SIZE       	(119)     //128-9
#define JUDGE_FRAME_HEADER_SOF      	(0xA5)
#define JUDGE_FRAME_HEADER_LENGTH   	(5u)
#define CLIENT_DATA_PACK_SIZE       	(28u)
#define CLIENT_DATA_LENGTH          	(19u)
#define INTERNATION_DART_PACK_SIZE		(19u)	
#define INTERNATION_DART_DATA_LENGTH	(10u)		
#define GRAPHIC_DATA_PACK_SIZE      	(6u)
#define GRAPHIC_DATA_LENGTH         	(21u)
#define GRAPHIC_DATA_LENGTH_DOUBLE    	(36u)

#define GRAPHIC_PACK_SIZE_SINGLE		(30u)
#define GRAPHIC_PACK_SIZE_DOUBLE		(45u)
#define GRAPHIC_PACK_SIZE_five			(90u)
#define GRAPHIC_REFRESHPACK_SIZE		(17u)	
#define REFRESHPACK_DATA_LENGTH      	 (8u)
#define CHAR_PACK_SIZE					(60u)
#define CHAR_DATA_LENGTH				(51u)

/*图形操作内容ID*/
#define DLETE_ALL											(0x02)		//删除所有图层
#define DLETE_ONE											(0x01)		//删除一个图层
#define GRAPHIC												(0x00)		//UI画图
#define FLOAT												(0x01)		//UI写浮点数
#define INT													(0x02)		//UI写整型
#define CHAR												(0x03)		//UI写字符

#define cmdID_GAME_STATE            	(0x0001)      //比赛状态数据， 1Hz 周期发送
#define cmdID_GAME_RESULT           	(0x0002)      //比赛结果数据，比赛结束后发送
#define cmdID_ROBOT_HP_DATA         	(0x0003)      //比赛机器人血量数据，1Hz 周期发送
#define cmdID_DART_STATUS           	(0x0004)      //飞镖发射状态数据,飞镖发射后发送
#define cmdID_EVENT_DATA            	(0x0101)      //场地事件数据，事件改变后发送
#define cmdID_SUPPLY_ACTION         	(0x0102)      //场地补给站动作标识数据，动作改变后发送
//#define cmdID_SUPPLY_BOOKING        	(0x0103)      //请求补给站补弹数据，由参赛队发送，上限 10Hz。（RM 对抗赛尚未开放）
#define cmdID_REFEREE_WARNING       	(0x0104)      //裁判警告数据，警告发生后发送
#define cmdID_DART_REMAINING_TIME   	(0x0105)      //飞镖发射口倒计时数据，1Hz 周期发送
#define cmdID_ROBOT_STATE           	(0x0201)      //机器人状态数据， 10Hz 周期发送
#define cmdID_POWER_HEAT            	(0x0202)      //实时功率热量数据， 50Hz 周期发送
#define cmdID_ROBOT_POS             	(0x0203)      //机器人位置数据， 10Hz 发送
#define cmdID_ROBOT_BUFF            	(0x0204)      //机器人增益数据， 增益状态改变后发送
#define cmdID_AERIAL_ENERGY        		(0x0205)      //空中机器人能量状态数据， 10Hz 周期发送，只有空中机器人主控发送
#define cmdID_HURT_STATE            	(0x0206)      //伤害状态数据，伤害发生后发送
#define cmdID_SHOOT_DATA           		(0x0207)      //实时射击数据，子弹发射后发送
#define cmdID_BULLET_REMAINING      	(0x0208)      //子弹剩余发送数，空中机器人以及哨兵机器人发送， 1Hz 周期发送
#define cmdID_RFID_STATUS           	(0x0209)      //机器人 RFID 状态数据，发送频率，1Hz
#define cmdID_DART_CLIENT_CMD       	(0x020A)      //飞镖机器人客户端指令数据，发送频率，10Hz
#define cmdID_ROBOT_INTER           	(0x0301)      //机器人间交互数据，发送方触发发送，上限 10Hz

#define interact_DART_ID				(0x0200)	  //飞镖控制数据内容的ID
/*
													1. 串口配置
														
														
通信方式是串口，配置为波特率 115200，8 位数据位，1 位停止位，无硬件流控，无校验位。




													2. 接口协议说明
通信协议格式：
frame_header (5-byte) | cmd_id (2-byte) | data (n-byte) | frame_tail (2-byte， CRC16， 整包校验)

表 1 frame_header 格式
SOF   	|   data_length   |    seq     |   CRC8
1-byte 	|   2-byte	      |    1-byte  |   1-byte

表 2 帧头详细定义
域			|	偏移位置     |	大小（字节）   |    详细描述
SOF			|	   0		|		1		 |	 数据帧起始字节，固定值为 0xA5
data_length	|	   1		|		2		 |	 数据帧中 data 的长度
seq			|	   3		|		1		 |	 包序号
CRC8		|	   4		|		1		 |	 帧头 CRC8 校验

表 3 cmd_id 命令码 ID 说明
    命令码      数据段长度              功能说明
    0x0001          3           比赛状态数据， 1Hz 周期发送
    0x0002          1           比赛结果数据，比赛结束后发送
    0x0003          32          比赛机器人血量数据， 1Hz 周期发送
	0x0004			3			飞镖发射状态，飞镖发射时发送	
	0x0005			3			人工智能挑战赛加成与惩罚区状态，1Hz 周期发送
    0x0101          4           场地事件数据，1Hz 周期发送
    0x0102          3           场地补给站动作标识数据，动作发生后发送
	0x0104			2			裁判警告数据，警告发生后发送
	0x0105			1			飞镖发射口倒计时，1Hz 周期发送
    0x0201          18          机器人状态数据，10Hz 周期发送
    0x0202          16          实时功率热量数据，50Hz 周期发送
    0x0203          16          机器人位置数据， 10Hz 发送
    0x0204          1           机器人增益数据，1Hz 周期发送
    0x0205          3           空中机器人能量状态数据，10Hz 周期发送，只有空中机器人主控发送
    0x0206          1           伤害状态数据，伤害发生后发送
    0x0207          6           实时射击数据，子弹发射后发送
    0x0208          2           弹丸剩余发射数，仅空中机器人，哨兵机器人以及 ICRA 机器人发送，1Hz 周期发送
	0x0209			4			机器人 RFID 状态，1Hz 周期发送
	0x020A			12			飞镖机器人客户端指令数据，10Hz 周期发送
    0x0301          n           机器人间交互数据，发送方触发发送，上限 10Hz*/
	
	
/*比赛状态数据： 0x0001。发送频率： 1Hz，发送范围：所有机器人
game_type比赛类型
• 1： RoboMaster 机甲大师赛;
• 2： RoboMaster 机甲大师单项赛;
• 3： ICRA RoboMaster 人工智能挑战赛
game_progress当前比赛阶段
• 0： 未开始比赛;
• 1： 准备阶段;
• 2： 自检阶段;
• 3： 5s 倒计时;
• 4： 对战中;
• 5： 比赛结算中
stage_remain_time当前阶段剩余时间，单位 s*/
typedef struct
{
    union
    {
        uint8_t value;
        struct
        {
            uint8_t     game_type           :   4   ;  //比赛类型
            uint8_t     game_progress       :   4   ;  //当前比赛阶段
        }GAMESTATE;
    }gamestate;
    uint16_t    stage_remain_time;          //当前阶段剩余时间
} ext_game_state_t;


/*比赛结果数据： 0x0002。 发送频率：比赛结束后发送，发送范围：所有机器人。
0 平局 1 红方胜利 2 蓝方胜利*/
typedef struct
{
    uint8_t winner;
} ext_game_result_t;


/* 机器人血量数据： 0x0003。发送频率： 1Hz，发送范围：所有机器人。
红 1 英雄机器人血量， 未上场以及罚下血量为 0
红 2 工程机器人血量
红 3 步兵机器人血量
红 4 步兵机器人血量
红 5 步兵机器人血量
红 7 哨兵机器人血量
红方前哨站血量
红方基地血量
蓝 1 英雄机器人血量
蓝 2 工程机器人血量
蓝 3 步兵机器人血量
蓝 4 步兵机器人血量
蓝 5 步兵机器人血量
蓝 7 哨兵机器人血量
蓝方前哨站血量
蓝方基地血量*/
typedef struct
{
    uint16_t red_1_robot_HP;
    uint16_t red_2_robot_HP;
    uint16_t red_3_robot_HP;
    uint16_t red_4_robot_HP;
    uint16_t red_5_robot_HP;
    uint16_t red_7_robot_HP;
	uint16_t red_outpost_HP;
    uint16_t red_base_HP;
    uint16_t blue_1_robot_HP;
    uint16_t blue_2_robot_HP;
    uint16_t blue_3_robot_HP;
    uint16_t blue_4_robot_HP;
    uint16_t blue_5_robot_HP;
    uint16_t blue_7_robot_HP;
	uint16_t blue_outpost_HP;
    uint16_t blue_base_HP;
} ext_game_robot_HP_t;


//飞镖发射状态
/*飞镖发射状态：0x0004。发送频率：飞镖发射后发送，发送范围：所有机器人
发射飞镖的队伍：
1：红方飞镖
2：蓝方飞镖
发射时的剩余比赛时间，单位 s */
typedef struct
{
 uint8_t dart_belong; 
 uint16_t stage_remaining_time; 
} ext_dart_status_t;


/*场地事件数据： 0x0101。 发送频率：1Hz 周期发送，发送范围：己方机器人。
bit 0-1： 己方停机坪占领状态
• 0  为无机器人占领;
• 1  为空中机器人已占领但未停桨;
• 2  为空中机器人已占领并停桨
bit 2-3： 己方能量机关状态：
bit 2： 为小能量机关激活状态，1 为已激活；
bit 3： 为大能量机关激活状态，1 为已激活；
bit 4： 己方基地虚拟护盾状态；
• 1  为基地有虚拟护盾血量；
• 0  为基地无虚拟护盾血量；
bit 5-31： 保留*/
typedef struct
{
    uint32_t event_type;
} ext_event_data_t;


/*补给站动作标识： 0x0102。 发送频率：动作触发后发送，发送范围：己方机器人
补给站口 ID：
1： 1 号补给口;
2： 2 号补给口
补弹机器人 ID： 
0 为当前无机器人补弹
1 为红方英雄机器人补弹， 2 为红方工程机器人补弹， 3/4/5 为红方步兵机器人补弹， 
101 为蓝方英雄机器人补弹， 102 为蓝方工程机器人补弹， 103/104/105 为蓝方步兵机器人补弹
出弹口开闭状态： 0 为关闭， 1 为子弹准备中， 2 为子弹下落
补弹数量：
50： 50 颗子弹;
100： 100 颗子弹;
150： 150 颗子弹;
200： 200 颗子弹。*/
typedef struct
{
    uint8_t supply_projectile_id;
    uint8_t supply_robot_id;
    uint8_t supply_projectile_step;
    uint8_t supply_projectile_num;
} ext_supply_projectile_action_t;



/* 裁判警告信息： cmd_id (0x0104)。发送频率：警告发生后发送，发送范围：己方机器人。
警告等级：
犯规机器人 ID：1 级以及 5 级警告时，机器人 ID 为 0；二三四级警告时，机器人 ID 为犯规机器人 ID
*/
typedef struct
{
    uint8_t level;
    uint8_t foul_robot_id;
} ext_referee_warning_t;



/*飞镖发射口倒计时：cmd_id (0x0105)。发送频率：1Hz 周期发送，发送范围：己方机器人。
15s 倒计时 */
typedef struct
{
 uint8_t dart_remaining_time;
} ext_dart_remaining_time_t;


/*比赛机器人状态： 0x0201。 发送频率： 10Hz，发送范围：单一机器人。
机器人 ID：
1 红方英雄机器人;2 红方工程机器人;3/4/5 红方步兵机器人;6 红方空中机器人;7 红方哨兵机器人;8 红方飞镖机器人;9 红方雷达站
101 蓝方英雄机器人;102 蓝方工程机器人;103/104/105 蓝方步兵机器人 106 蓝方空中机器人;蓝方哨兵机器人;108 蓝方飞镖机器人;109 蓝方雷达站。
机器人等级：
1： 一级; 2： 二级; 3： 三级。
机器人剩余血量
机器人上限血量
机器人 17mm 枪口每秒冷却值
机器人 17mm 枪口热量上限
机器人 42mm 枪口每秒冷却值
机器人 42mm 枪口热量上限
机器人 17mm 枪口上限速度 单位 m/s
机器人 42mm 枪口上限速度 单位 m/s
机器人最大底盘， 单位 w
主控电源输出情况：
0 bit： gimbal 口输出： 1 为有 24V 输出， 0 为无 24v 输出;
1 bit： chassis 口输出： 1 为有 24V 输出， 0 为无 24v 输出;
2 bit： shooter 口输出： 1 为有 24V 输出， 0 为无 24v 输出;*/
typedef struct
{
    uint8_t robot_id;
    uint8_t robot_level;
    uint16_t remain_HP;
    uint16_t max_HP;
    uint16_t shooter_heat0_cooling_rate; //机器人 17mm 枪口每秒冷却值
    uint16_t shooter_heat0_cooling_limit; //机器人 17mm 枪口热量上限 
    uint16_t shooter_heat1_cooling_rate;
    uint16_t shooter_heat1_cooling_limit;
	uint8_t shooter_heat0_speed_limit;  //机器人 17mm 枪口上限速度 单位 m/s
	uint8_t shooter_heat1_speed_limit;
	uint8_t max_chassis_power;
    union
    {
        uint8_t value;
        struct
        {
            uint8_t gimbal_output           :   1   ;
            uint8_t chassis_output          :   1   ;
            uint8_t shooter_output          :   1   ;
            uint8_t Reserved                :   5   ;
        }MASTERPOWER;
    }mainctrlpower;
} ext_game_robot_state_t;



/*实时功率热量数据： 0x0202。 发送频率： 50Hz
底盘输出电压 单位 毫伏
底盘输出电流 单位 毫安
底盘输出功率 单位 W 瓦
底盘功率缓冲 单位 J 焦耳  备注：飞坡根据规则增加至 250J
17mm 枪口热量
42mm 枪口热量
机动 17 mm 枪口热量*/
typedef struct
{
    uint16_t chassis_volt;
    uint16_t chassis_current;
    float    chassis_power;
    uint16_t chassis_power_buffer;
    uint16_t shooter_heat0;
    uint16_t shooter_heat1;
	uint16_t mobile_shooter_heat2;
} ext_power_heat_data_t;



/*机器人位置： 0x0203。 发送频率： 10Hz，发送范围：单一机器人
位置 x 坐标，单位 m
位置 y 坐标，单位 m
位置 z 坐标，单位 m
位置枪口，单位度*/
typedef struct
{
    float x;
    float y;
    float z;
    float yaw;
} ext_game_robot_pos_t;


/*机器人增益： 0x0204。 发送频率：1Hz 周期发送，发送范围：单一机器人
bit 0： 机器人血量补血状态
bit 1： 枪口热量冷却加速
bit 2： 机器人防御加成
bit 3： 机器人攻击加成
其他 bit 保留*/
typedef union
{
    struct
    {
        uint8_t robotHPState                :   1   ;
        uint8_t shooterHeatCoolUp           :   1   ;
        uint8_t robotDefenseBuff            :   1   ;
        uint8_t robotAttackBuff             :   1   ;
        uint8_t Reserved                    :   4   ;
    }ROBOTPLUS;
    uint8_t power_rune_buff;
}ext_buff_musk_t;


/*空中机器人能量状态： 0x0205。 发送频率： 10Hz，发送范围：单一机器人
积累的能量点
可攻击时间 单位 s。 30s 递减至 0*/
typedef struct
{
    uint8_t energy_point;
    uint8_t attack_time;
} aerial_robot_energy_t;



/*伤害状态： 0x0206。 发送频率：伤害发生后发送，发送范围：单一机器人
bit 0-3： 当血量变化类型为装甲伤害，代表装甲 ID，其中数值为 0-4 号代表机器人的五个装甲片，其他血量变化类型，该变量数值为 0。
bit 4-7： 血量变化类型
        0x0 装甲伤害扣血;
        0x1 模块掉线扣血;
        0x2 超射速扣血；
        0x3 超枪口热量扣血；
        0x4 超底盘功率扣血；
        0x5 装甲撞击扣血*/
typedef struct
{
    union
    {
        uint8_t value;
        struct
        {
            uint8_t armor_id                :   4   ;
            uint8_t hurt_type               :   4   ;
        }HURTSTATE;
    }hurtstate;
} ext_robot_hurt_t;


/*实时射击信息： 0x0207。 发送频率：射击后发送，发送范围：单一机器人
子弹类型: 1： 17mm 弹丸 2： 42mm 弹丸
子弹射频 单位 Hz
子弹射速 单位 m/s*/
typedef struct
{
    uint8_t bullet_type;
    uint8_t bullet_freq;
    float   bullet_speed;
    uint16_t current_bullet_num;
} ext_shoot_data_t;


/*子弹剩余发射数： 0x0208。发送频率： 1Hz 周期发送， 空中机器人，哨兵机器人以及 ICRA 机器人主控发送，发送范围：单一机器人。
子弹剩余发射数目*/
typedef struct
{
    uint16_t bullet_remaining_num;
} ext_bullet_remaining_t;



/*机器人 RFID 状态： 0x0209。发送频率：1Hz，发送范围：单一机器人。
bit 0:基地增益点 RFID 状态
bit 1:高地增益点 RFID 状态；
bit 2:能量机关激活点 RFID 状态；
bit 3:飞坡增益点 RFID 状态；
bit 4:前哨岗增益点 RFID 状态；
bit 5:资源岛增益点 RFID 状态；
bit 6:补血点增益点 RFID 状态；
bit 7:工程机器人补血卡 RFID 状态；
bit 8-25：保留
bit 26-31：人工智能挑战赛 F1-F6 RFID 状态；
RFID 状态不完全代表对应的增益或处罚状态，例如敌方已占领的高地增益点，不
能获取对应的增益效果。*/
typedef struct
{
	uint32_t rfid_status;
} ext_rfid_status_t;



/*飞镖机器人客户端指令数据：0x020A。发送频率：10Hz，发送范围：单一机器人。
当前飞镖发射口的状态:  		0：关闭;1：正在开启或者关闭中;2：已经开启
飞镖的打击目标，默认为前哨站:	1：前哨站;2：基地
切换打击目标时的比赛剩余时间，单位秒，从未切换默认为 0。
检测到的第一枚飞镖速度，单位 0.1m/s/LSB, 未检测是为 0。
检测到的第二枚飞镖速度，单位 0.1m/s/LSB，未检测是为 0。
检测到的第三枚飞镖速度，单位 0.1m/s/LSB，未检测是为 0。
检测到的第四枚飞镖速度，单位 0.1m/s/LSB，未检测是为 0。
最近一次的发射飞镖的比赛剩余时间，单位秒，初始值为 0。
最近一次操作手确定发射指令时的比赛剩余时间，单位秒, 初始值为 0。*/
typedef struct
{
 uint8_t dart_launch_opening_status;
 uint8_t dart_attack_target;
 uint16_t target_change_time;
 uint8_t first_dart_speed;
 uint8_t second_dart_speed;
 uint8_t third_dart_speed;
 uint8_t fourth_dart_speed;
 uint16_t last_dart_launch_time;
 uint16_t operate_launch_cmd_time;
} ext_dart_client_cmd_t;

/*
													3. 机器人交互数据
交互数据包括一个统一的数据段头结构。数据段包含了内容 ID，发送者以及接收者的 ID 和内容数据段，
整个交互数据的包总共长最大为 128 个字节，减去 frame_header,cmd_id 和 frame_tail 共 9 个字节以
及数据段头结构的 6 个字节，故而发送的内容数据段最大为 113。整个交互数据 0x0301 的字节限制如
下表所示，其中数据量包括 frame-header,cmd_id,frame_tail 以及数据段头结构的字节数量。

机器人类型	|	每秒字节量限制数目
雷达站 		|	5120 字节每秒
英雄机器人 	|	3720 字节每秒
工程机器人 	|	3720 字节每秒
步兵机器人 	|	3720 字节每秒
哨兵机器人 	|	3720 字节每秒
空中机器人 	|	3720 字节每秒
*/


/*交互数据接收信息： 0x0301。
数据段的内容 ID
发送者的 ID____需要校验发送者的 ID 正确性，例如红 1 发送给红 5，此项需要校验红 1
接收者的 ID____需要校验接收者的 ID 正确性，例如不能发送到敌对机器人的ID
内容数据段，最大为 113*/
typedef struct
{
    uint16_t data_cmd_ID;
    uint16_t sender_ID;
    uint16_t receiver_ID;
} ext_student_interactive_header_data_t;
/*
内容 ID			|	长度（头结构长度+内容数据段长度）	|	功能说明
0x0200~0x02FF	|	6+n								|	己方机器人间通信
0x0100			|	6+2								|	客户端删除图形
0x0101			|	6+15							|	客户端绘制一个图形
0x0102			|	6+30							|	客户端绘制二个图形
0x0103			|	6+75							|	客户端绘制五个图形
0x0104			|	6+105							|	客户端绘制七个图形
0x0110			|	6+45 							|	客户端绘制字符图形
由于存在多个内容 ID，整个 cmd_id 上行频率限制每秒字节总量，请合理安排带宽。

ID 说明
1. 机器人 ID：1，英雄(红)；2，工程(红)；3/4/5，步兵(红)；6，空中(红)；7，哨兵(红)；9，雷达站
（红）；101，英雄(蓝)；102，工程(蓝)；103/104/105，步兵(蓝)；106，空中(蓝)；107，哨兵(蓝)；
109，雷达站（蓝）。
2. 客户端 ID ： 0x0101 为 英 雄 操 作 手 客 户 端 ( 红 ) ； 0x0102 ， 工 程 操 作 手 客 户 端 (( 红 ) ；
0x0103/0x0104/0x0105，步兵操作手客户端(红)；0x0106，空中操作手客户端((红)； 0x0165，英
雄操作手客户端(蓝)；0x0166，工程操作手客户端(蓝)；0x0167/0x0168/0x0169，步兵操作手客户
端步兵(蓝)；0x016A，空中操作手客户端(蓝)。
*/



//学生机器人间通信 cmd_id 0x0301，内容 ID:0x0200~0x02FF
/*交互数据 机器人间通信：0x0301。
数据的内容 ID 0x0200~0x02FF,可以在以上 ID 段选取，具体 ID 含义由参赛队自定义
发送者的 ID 需要校验发送者的 ID 正确性
接收者的 ID 需要校验接收者的 ID 正确性，例如不能发送到敌对机器人的ID
数据段 大小n，n 需要小于 113*/
typedef struct
{
	uint8_t data[INTERACTIVE_DATA_MAX_SIZE];
} robot_interactive_data_t;


/*客户端删除图形 机器人间通信：0x0301
数据的内容 ID	0x0100
发送者的 ID 		需要校验发送者的 ID 正确性
接收者的 ID		需要校验接收者的 ID 正确性，仅支持发送机器人对应的客户端
图形操作			包括:0: 空操作；1: 删除图层；2: 删除所有
图层数			图层数：0~9
*/
typedef struct
{
	uint8_t operate_tpye; 
	uint8_t layer; 
} ext_client_custom_graphic_delete_t;


/*图形数据
图形名	在删除，修改等操作中，作为客户端的索引。
图形配置 1
bit 0-2：图形操作：
0：空操作；
1：增加；
2：修改；
3：删除；
Bit 3-5：图形类型：
0：直线；
1：矩形；
2：整圆；
3：椭圆；
4：圆弧；
5：浮点数；
6：整型数；
7：字符；
Bit 6-9：图层数，0~9
Bit 10-13：颜色： 0：红蓝主色；
1：黄色；
2：绿色；
3：橙色；
4：紫红色；
5：粉色；
6：青色；
7：黑色；
8：白色；
Bit 14-22：起始角度，单位：°，范围[0,360]；
Bit 23-31：终止角度，单位：°，范围[0,360]。

图形配置 2
Bit 0-9：线宽；
Bit 10-20：起点 x 坐标；
Bit 21-31：起点 y 坐标。

图形配置 3
Bit 0-9：字体大小或者半径；
Bit 10-20：终点 x 坐标；
Bit 21-31：终点 y 坐标。*/
typedef struct
{ 
	uint8_t graphic_name[3]; 
	uint32_t operate_tpye:3; 
	uint32_t graphic_tpye:3; 
	uint32_t layer:4; 
	uint32_t color:4; 
	uint32_t start_angle:9;
	uint32_t end_angle:9;
	uint32_t width:10; 
	uint32_t start_x:11; 
	uint32_t start_y:11;
	uint32_t radius:10; 
	uint32_t end_x:11; 
	uint32_t end_y:11; 
} graphic_data_struct_t;


//图形配置详见下表，其中空代表该字段的数据对该图形无影响，推荐字体大小与线宽比例为 10:1
/*
类型		|	start_angle |	end_angle	  	| width   |	start_x 	   | start_y 	|	radius  |  end_x 		   | end_y
直线		|	空			|	空			  	| 线条宽度 | 起点 x 坐标	| 起点 y 坐标 |	空	      |  终点 x坐标		 | 终点 y坐标
矩形		|	空			|	空			  	| 线条宽度 | 起点 x 坐标	| 起点 y 坐标 |	空	      |  对角顶点 x 坐标 | 对角顶点 y 坐标
正圆		|	空			|	空			  	| 线条宽度 | 圆心 x 坐标	| 圆心 y 坐标 |	半径      |  空			     | 空
椭圆		|	空			|	空			  	| 线条宽度 | 圆心 x 坐标	| 圆心 y 坐标 |	空	      |  x 半轴长度		 | y 半轴长度
圆弧		|	起始角度	|	终止角度	     | 线条宽度 | 圆心 x 坐标	 | 圆心 y 坐标 |	空	   |  x 半轴长度      | y 半轴长度
浮点数	    |	字体大小	|	小数位有效个数 	  | 线条宽度 | 起点 x 坐标	  | 起点 y 坐标 |	32 位浮点数，float
整型数  	|	字体大小	|	空			 	 | 线条宽度 | 起点 x 坐标	 | 起点 y 坐标 |	32 位整型数，int32_t
字符		|	字体大小	|	字符长度	     | 线条宽度 | 起点 x 坐标	 | 起点 y 坐标 |	空	   |  空			 | 空
*/



/*客户端绘制一个图形 机器人间通信：0x0301。
数据的内容 ID	0x0101
发送者的 ID		需要校验发送者的 ID 正确性
接收者的 ID		需要校验接收者的 ID 正确性，仅支持发送机器人对应的客户端
图形 1 			详见图形数据介绍*/
typedef struct
{
	graphic_data_struct_t grapic_data_struct;
} ext_client_custom_graphic_single_t;


/*客户端绘制二个图形 机器人间通信：0x0301。
数据的内容 ID	0x0102
发送者的 ID		需要校验发送者的 ID 正确性
接收者的 ID		需要校验接收者的 ID 正确性，仅支持发送机器人对应的客户端
图形 1			详见图形数据介绍
图形 2			详见图形数据介绍*/
typedef struct
{
	graphic_data_struct_t grapic_data_struct[2];
} ext_client_custom_graphic_double_t;



/*客户端绘制五个图形 机器人间通信：0x0301。
数据的内容 ID	0x0103
发送者的 ID		需要校验发送者的 ID 正确性
接收者的 ID		需要校验接收者的 ID 正确性，仅支持发送机器人对应的客户端
图形 1			详见图形数据介绍
图形 2			详见图形数据介绍
图形 3			详见图形数据介绍
图形 4			详见图形数据介绍
图形 5			详见图形数据介绍*/
typedef struct
{
	graphic_data_struct_t grapic_data_struct[5];
} ext_client_custom_graphic_five_t;


/*客户端绘制七个图形 机器人间通信：0x0301。
数据的内容 ID	0x0104
发送者的 ID		需要校验发送者的 ID 正确性
接收者的 ID		需要校验接收者的 ID 正确性，仅支持发送机器人对应的客户端
图形 1			详见图形数据介绍
图形 2			详见图形数据介绍
图形 3			详见图形数据介绍
图形 4			详见图形数据介绍
图形 5			详见图形数据介绍
图形 6			详见图形数据介绍
图形 7			详见图形数据介绍*/
typedef struct
{
	graphic_data_struct_t grapic_data_struct[7];
} ext_client_custom_graphic_seven_t;




//客户端自定义数据： cmd_id:0x0301。 内容 ID:0xD180。
/*客户端 客户端自定义数据： cmd_id:0x0301。内容 ID:0xD180。 发送频率：上限 10Hz
数据的内容 ID 0xD180
发送者的 ID 需要校验发送者机器人的 ID 正确性
客户端的 ID 只能为发送者机器人对应的客户端
自定义浮点数据 1 在客户端自定义数据显示面板上显示该浮点数
自定义浮点数据 2 在客户端自定义数据显示面板上显示该浮点数
自定义浮点数据 3 在客户端自定义数据显示面板上显示该浮点数
自定义 8 位数据 4
bit 0-5： 分别控制客户端自定义数据显示面板上的六个指示灯， 值为 1 时显示绿色， 值为 0 是显示红色。
Bit 6-7： 保留*/
typedef struct
{
    float data1;
    float data2;
    float data3;
    union
    {
        uint8_t value;
        struct
        {   //[7:2]对应指示灯(从左往右), [1:0]低两位无定义
            uint8_t bit7_DbusOn                	:   1   ;
			uint8_t bit6_DCPowerOn            	:   1   ;
            uint8_t bit5_GmOn                	:   1   ;
            uint8_t bit4_CmOn                	:   1   ;
            uint8_t bit3_StorageOpen           	:   1   ;
            uint8_t bit2                		:   1   ;
            uint8_t bit1                		:   1   ;
            uint8_t bit0                		:   1   ;
        }MASKS;
    }masks;
} client_custom_data_t;


/*客户端绘制字符 机器人间通信：0x0301。
数据的内容 ID	0x0110
发送者的 ID		需要校验发送者的 ID 正确性
接收者的 ID		需要校验接收者的 ID 正确性，仅支持发送机器人对应的客户端
字符配置			详见图形数据介绍
字符	*/
typedef struct
{
	graphic_data_struct_t grapic_data_struct;
	uint8_t data[30];
} ext_client_custom_character_t;




//机器人通信数据结构体
typedef struct
{
    ext_student_interactive_header_data_t   header_data;
    robot_interactive_data_t                inter_data;
} robot_interactive_mesg_t, *P_robot_interactive_mesg_t;
//发送到客户端的数据结构体
typedef struct
{
    ext_student_interactive_header_data_t   header_data;
    client_custom_data_t                    custom_data;
} client_interactive_mesg_t, *P_client_interactive_mesg_t;
//客户端自定义图形的数据结构体
typedef struct
{
    ext_student_interactive_header_data_t   header_data;
    graphic_data_struct_t                   graphic_data;
	uint8_t									UItype;
	float 									UIFloat;
	int 									UIInt;
	char 									Char_TX_PACK[30];
} graphic_interactive_mesg_t, *P_graphic_interactive_mesg_t;
//接收信息状态机
typedef enum
{
    JUD_FrameHeader_SOF,
    JUD_FrameHeader_DataLength,
    JUD_FrameHeader_Seq,
    JUD_FrameCRC8,
    JUD_CmdID,
    JUD_DATA,
    JUD_FrameTail,
} JudgeRX_State_t, *P_JudgeRX_State_t;
//状态机处理过程临时数据存储
typedef struct
{
    struct
    {
        uint16_t    dataLength;
        uint8_t     packSeq;
        uint8_t     crc8Check;
        uint16_t    cmdId;
        uint16_t    crc16Check;
    }PACKDATA;
    uint8_t PackData[JUDGE_RX_DATA_MAX_SIZE];
} rxPackMesg_t, *P_rxPackMesg_t;
//接收裁判系统信息的结构体
typedef struct
{
    rxPackMesg_t                        PackMesg;                   //接收裁判系统临时数据
    ext_game_state_t                    game_state;                 //比赛状态信息
    ext_game_result_t                   game_result;                //比赛结果信息
    ext_game_robot_HP_t                 game_robot_HP;              //机器人血量数据
	ext_dart_status_t					dart_state;					//飞镖发射状态
    ext_event_data_t                    event_data;                 //场地事件数据
    ext_supply_projectile_action_t      supply_projectile_action;   //补给站动作标识
//    ext_supply_projectile_booking_t     supply_projectile_booking;  //请求补给站补给子弹
    ext_referee_warning_t               referee_warning;            //裁判警告信息
	ext_dart_remaining_time_t			dart_remaining_time;		//飞镖发射口倒计时
    ext_game_robot_state_t              game_robot_state;           //比赛机器人状态
    ext_power_heat_data_t               power_heat_data;            //实时功率热量数据
    ext_game_robot_pos_t                game_robot_pos;             //机器人位置信息
    ext_buff_musk_t                     buff_musk;                  //机器人增益
    aerial_robot_energy_t               aerial_robot_energy;        //空中机器人能量
    ext_robot_hurt_t                    robot_hurt;                 //伤害状态
    ext_shoot_data_t                    shoot_data;                 //实时射击信息
    ext_bullet_remaining_t              bullet_remaining;           //子弹剩余发射数
	ext_rfid_status_t					rfid_state;					//机器人RFID状态
	ext_dart_client_cmd_t				dart_client_cmd;			//飞镖机器人客户端指令数据
    robot_interactive_mesg_t            RobotMesg;                  //接收的机器人交互信息
} rxJudge_Mesg_t, *P_rxJudge_Mesg_t;
//发送到裁判系统信息结构体
typedef struct
{
    uint16_t    tx_data_cmd_id;
    client_interactive_mesg_t          ClientMesg;  //发送的客户端交互信息
    robot_interactive_mesg_t           RobotMesg;   //发送的机器人交互信息
    graphic_interactive_mesg_t         GraphicMesg; //发送的自定义图形交互信息
} txJudge_Mesg_t, *P_txJudge_Mesg_t;
//裁判系统句柄
typedef struct
{
    rxJudge_Mesg_t      rxMesg;         //接收裁判系统的信息结构体
    txJudge_Mesg_t      txMesg;         //发送到裁判系统信息结构体
} Judge_HANDLE_t, *P_Judge_HANDLE_t;

extern uint8_t clientTxData[CLIENT_DATA_PACK_SIZE];

void JudgeSys_Init(P_Judge_HANDLE_t pjud_hadl);
void JudgeSys_RX_Message(uint8_t rxData, P_rxJudge_Mesg_t prx_mesg);
void JudgeSys_TX_Message(P_txJudge_Mesg_t ptx_mesg);
void Robot_TX_Message(P_robot_interactive_mesg_t probotmesg,uint16_t Self_def_cmd,uint16_t Receiver_Type);

//APP应用函数
void Graphic_TX_Message(P_graphic_interactive_mesg_t P_Graphic_Mesg, uint8_t TpyeUI);
void Char_TX_Message(P_graphic_interactive_mesg_t P_Graphic_Mesg);
void UI_ShowEnergy(float UI_Cap_Remain_Energy);

//底层驱动函数
void Refresh_Graph(uint8_t operate_graph_tpye,uint8_t graphic_tpye);
void UI_grapgic_One(ext_client_custom_graphic_single_t Tx_graphic_single);
void UI_grapgic_double(ext_client_custom_graphic_double_t Tx_graphic_double);

#endif

